package io.github.cubelitblade.librarymanagementbackend.vo;

import io.github.cubelitblade.librarymanagementbackend.entity.BorrowRecord;
import io.github.cubelitblade.librarymanagementbackend.entity.BorrowRecordView;
import io.github.cubelitblade.librarymanagementbackend.utils.BorrowStatus;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDate;
import java.util.List;

/**
 * 表示用于前端展示的借阅信息。
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BorrowResponseVO {
    private Integer id;
    private Integer userId;
    private BookBriefVO book;
    private LocalDate borrowTime;
    private LocalDate deadline;
    private BorrowStatus status;

    /**
     * 工厂方法。根据已有的 {@link BorrowRecord} 实体创建 {@link BorrowResponseVO} 视图对象。
     * <p>适用于借书、还书等流程中的返回数据构建。注意：该方法不会判断是否逾期。</p>
     *
     * @param borrowRecord 原始借阅记录实体。
     * @param bookBriefVO  图书简要信息。
     * @return 借阅记录视图对象。
     */
    public static BorrowResponseVO of(BorrowRecord borrowRecord, BookBriefVO bookBriefVO) {
        return new BorrowResponseVO(
                borrowRecord.getId(),
                borrowRecord.getUserId(),
                bookBriefVO,
                borrowRecord.getBorrowTime(),
                borrowRecord.getDeadline(),
                borrowRecord.getStatus()
        );
    }

    /**
     * 工厂方法。根据 {@link BorrowRecordView} SQL 视图实体创建 {@link BorrowResponseVO} 视图对象。
     * <p>适用于查询用户借阅记录时返回数据，其中状态字段可动态判断是否逾期。</p>
     *
     * @param borrowRecordView 含动态逾期判断的 SQL 视图实体。
     * @return 借阅记录视图对象。
     */
    public static BorrowResponseVO of(BorrowRecordView borrowRecordView) {
        return new BorrowResponseVO(
                borrowRecordView.getId(),
                borrowRecordView.getUserId(),
                new BookBriefVO(
                        borrowRecordView.getBookId(),
                        borrowRecordView.getBookTitle(),
                        borrowRecordView.getBookAuthor(),
                        borrowRecordView.getBookStock(),
                        borrowRecordView.getBookImg()
                ),
                borrowRecordView.getBorrowTime(),
                borrowRecordView.getDeadline(),
                borrowRecordView.getStatus()
        );
    }

    /**
     * 将 {@link BorrowRecordView} 类型的列表转换为 {@link BorrowResponseVO} 类型的列表。
     *
     * @param borrowRecordViews 待转换的列表。
     * @return 转换完成后的列表。
     */
    public static List<BorrowResponseVO> ofList(List<BorrowRecordView> borrowRecordViews) {
        return borrowRecordViews.stream().map(BorrowResponseVO::of).toList();
    }
}

